"""
访问限制
- 单下划线：表示 protected，只允许类本身和子类进行访问，可以通过对象名访问
- 双下划线：表示 private，只允许类本身去访问，不能通过类的对象取访问，
    但可以通过 [对象名._类名__xxx] 来访问
- 首位双下划线：表示特殊方法，一般是系统定义的名字
"""


class Student:
    # 首尾双下划线，系统定义
    def __init__(self, name, age, gender):
        # protected，类自身和子类可以访问
        self._name = name
        # private，只能类自身访问
        self.__age = age
        self.gender = gender

    # protected
    def _func1(self):
        print('类自身和子类可以访问')
        print(self._name)

    # private
    def __func2(self):
        print('类自身访问')
        print(self.__age)

    # public
    def show(self):
        self._func1()
        self.__func2()
        print(self.gender)


stu = Student('张三', 20, '女')
print('name: ', stu._name)
# 无法访问
# print('age: ', stu.__age)
# 访问类的 private 成员
print('age: ', stu._Student__age)
print('gender: ', stu.gender)
print('func1: ', stu._func1())
# 无法访问
# print('func2: ', stu.__func2())
# 访问类的 private 方法
print('func2: ', stu._Student__func2())
print('show: ', stu.show())
